#ifndef _COBJECT_H_
#define _COBJECT_H_

#define COBJECT_MAJOR_VERSION 	1
#define	COBJECT_MINOR_VERSION	0
#define	COBJECT_MICRO_VERSION	0

/* 编程思想之一：尽可能不影响C编码风格基础上模拟面向对象
 * 使用原则：
 * 1，结构体第一个成员为cclass静态变量即声明为类
 * 2，父类对象可为子类静态变量，也可为指针变量
 * 3，类不能作为本类静态变量，可作为本类指针变量
 * 4，子类只能重写父类虚函数，不能重写父类的父类的虚函数　
 * 5，建议所有类对象通过_ctor/_dtor或_new/_del作为构造/析构函数后缀
 * 6，建议普通结构体通过_init/_clean或_alloc/_free作为初始化/销毁函数后缀
 * */

#define _STR(s) #s // 可避免CCLASS_NAME传入s为宏不会被再次展开的情况

#define CCLASS_NAME(s) _STR(s)
#define CCLASS_SIZE(s) sizeof(s)
#define CCLASS_INFO(s) CCLASS_NAME(s), CCLASS_SIZE(s)

#define CVIRTUAL // 基类虚函数标记，提醒用无实际意义
#define CCLASS_INFO_NONE {NULL, 0}
#define COBJECT_NONE NULL

typedef void* cobject;
typedef void* cmethod;
// 运行时对象的类信息，参照c++的type_info
typedef struct {
    char *name;
    int size;
} cclass_info;
typedef struct {
    unsigned char flag[4]; //　类对象标记，是否为对象的基本条件
    cclass_info info; // 类信息
    cobject *inherit; // 父类对象列表
    int inherit_nr; // 父类对象数量
} cclass;

// 对象创建
cobject cobject_new(char* cclass_name, int cclass_size);
// 对象销毁
void cobject_del(cobject obj);

// 对象构造
void cobject_ctor(cobject obj, char* cclass_name, int cclass_size);
// 对象析构
void cobject_dtor(cobject obj);

// 设置对象所继承的父对象
void cobject_inherit(cobject obj, cobject parent);
// 设置对象所继承的父类方法的重写
#define cobject_override(obj, virf, override) (obj)->virf = (override)
// 取消对象所继承的父类方法的重写
#define cobject_unoverride(obj, virf) (obj)->virf = NULL

// 运行时对象的类信息，参照c++的typeid
cclass_info cobject_id(cobject obj);
// 是否当前类对象
int cobject_type(cobject obj, char* cclass_name);
// 获取当前类对象（obj为当前类对象或子类对象）
cobject cobject_self(cobject obj, char* cclass_name);

#endif
